Only document platform-relevant dependencies
authorAlex Crichton <alex@alexcrichton.com>
Tue, 1 Sep 2015 17:14:32 +0000 (10:14 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Tue, 1 Sep 2015 17:14:32 +0000 (10:14 -0700)
The recent change in #1939 ended up accidentally pulling in irrelevant
platform-specific dependencies into a normal `cargo doc`, causing those builds
to fail. This change tweaks the logic for calculating documentation dependencies
to account for filtering based on the relevant platform.

src/cargo/ops/cargo_rustc/context.rs
tests/test_cargo_doc.rs

index d9565294d8aac1f7b57f8f674c8a33c4aacae89c..44839f7c9bdaa3d723cd0402763d3896dab08e38 100644 (file)
@@ -7,7 +7,7 @@ use std::sync::Arc;
 use regex::Regex;
 
 use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target, Profile};
-use core::{TargetKind, LibKind, Profiles, Metadata};
+use core::{TargetKind, LibKind, Profiles, Metadata, Dependency};
 use util::{self, CargoResult, ChainError, internal, Config, profile};
 use util::human;
 
@@ -343,7 +343,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
                        profile: &Profile)
                        -> Vec<(&'a Package, &'a Target, &'a Profile)> {
         if profile.doc {
-            return self.doc_deps(pkg, target);
+            return self.doc_deps(pkg, target, kind);
         }
         let deps = match self.resolve.deps(pkg.package_id()) {
             None => return Vec::new(),
@@ -367,15 +367,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
 
                 // If this dependency is only available for certain platforms,
                 // make sure we're only enabling it for that platform.
-                let is_platform_same = match (d.only_for_platform(), kind) {
-                    (Some(ref platform), Kind::Host) => {
-                        *platform == self.config.rustc_info().host
-                    },
-                    (Some(ref platform), Kind::Target) => {
-                        *platform == self.target_triple
-                    },
-                    (None, _) => true
-                };
+                let is_platform_same = self.dep_platform_activated(d, kind);
 
                 // If the dependency is optional, then we're only activating it
                 // if the corresponding feature was activated
@@ -418,16 +410,17 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
     }
 
     /// Returns the dependencies necessary to document a package
-    fn doc_deps(&self, pkg: &Package, target: &Target)
+    fn doc_deps(&self, pkg: &Package, target: &Target, kind: Kind)
                 -> Vec<(&'a Package, &'a Target, &'a Profile)> {
         let pkg = self.get_package(pkg.package_id());
         let deps = self.resolve.deps(pkg.package_id()).into_iter();
         let deps = deps.flat_map(|a| a).map(|id| {
             self.get_package(id)
         }).filter(|dep| {
-            pkg.dependencies().iter().find(|d| {
+            let dep = pkg.dependencies().iter().find(|d| {
                 d.name() == dep.name()
-            }).unwrap().is_transitive()
+            }).unwrap();
+            dep.is_transitive() && self.dep_platform_activated(dep, kind)
         }).filter_map(|dep| {
             dep.targets().iter().find(|t| t.is_lib()).map(|t| (dep, t))
         });
@@ -457,6 +450,20 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
         return ret
     }
 
+    fn dep_platform_activated(&self, dep: &Dependency, kind: Kind) -> bool {
+        // If this dependency is only available for certain platforms,
+        // make sure we're only enabling it for that platform.
+        match (dep.only_for_platform(), kind) {
+            (Some(ref platform), Kind::Host) => {
+                *platform == self.config.rustc_info().host
+            },
+            (Some(ref platform), Kind::Target) => {
+                *platform == self.target_triple
+            },
+            (None, _) => true
+        }
+    }
+
     /// Gets a package for the given package id.
     pub fn get_package(&self, id: &PackageId) -> &'a Package {
         self.package_set.iter()
index 7464e3774b97936df09f57ff7e463abafc498036..5d6d8a90e1f23f51384c0f6ca68fbb967b122305 100644 (file)
@@ -289,3 +289,27 @@ test!(doc_target {
     assert_that(&p.root().join(&format!("target/{}/doc", TARGET)), existing_dir());
     assert_that(&p.root().join(&format!("target/{}/doc/foo/index.html", TARGET)), existing_file());
 });
+
+test!(target_specific_not_documented {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.0.1"
+            authors = []
+
+            [target.foo.dependencies]
+            a = { path = "a" }
+        "#)
+        .file("src/lib.rs", "")
+        .file("a/Cargo.toml", r#"
+            [package]
+            name = "a"
+            version = "0.0.1"
+            authors = []
+        "#)
+        .file("a/src/lib.rs", "not rust");
+
+    assert_that(p.cargo_process("doc"),
+                execs().with_status(0));
+});